<?php
/**
 识别那种键值键值混合在一起的字符串
**/
function ceshi(){
        $keywords = [
            "身高",
            "门齿",
            "皮肤",
            "医生",
        ];
        $keywords = $init = [
          "身"=>[
              "高"=>"身高",
              "体"=>"身体"
          ],"皮"=>[
              "肤"=>"皮肤"
            ],
            "医"=>[
                "生"=>"医生"
            ]
        ];

        $str = "身高:,。170cm身体:未见异常医生皮肤很好";
        //读到身的时候 我找出第一个是身的词 组成一个集合，当扫描到第二个字的时候 如果没有 则退回放弃状态 如果继续扫描匹配到了第二个字
        $key = "";
        $val = "";
        $result = [];
        $state = 0;
        foreach (mb_str_split($str) as $c)
        {
            echo $c;
            //去掉无关的字符
            if(in_array($c,[':',",","，","。"])) continue;
            if(!empty($keywords[$c])){
                if($state == 0) {
                    $state = 2;
                    $key .= $c;
                }else if($state == 2){
                    $key .= $c;
                }else if($state == 1){
                    $state = 2;
                    $key .= $c;
                }

                if(is_string($keywords[$c])){
                    $state = 0;
                    if(!empty($val)){
                        array_push($result,[2,$val]);
                        $val = '';
                    }

                    array_push($result,[1,$key]); // 1代表key 2代表值
                    $keywords = $init;
                    $key = '';
                }

                if($state != 0){
                    $keywords = $keywords[$c];
                }
            }else{
                if($state == 0){
                    $state = 1;
                    $val .= $c;
                }else if($state == 2){
                    $state = 1;
                    $val .= $key;
                    $key = "";
                }else if($state == 1){
                    $val .= $c;
                }
            }
        }
        array_push($result,[2,$val]);
        $val = "";
        var_dump($result);

        //状态0  开始状态什么都没有找到 或者已经匹配完成
        //状态1  没有匹配到
        //状态2  好像匹配到


        //从0状态开始
        //  遇到未识别得字 进入状态1  当前的字拼接到值中
        //  遇到在集合的字 进入到状态2 当前字拼接到疑似key中
        //状态1  遇到集合的字  进入到状态2  当前字拼接到疑似key中
        //       遇到未识别的字 进入到状态1 当前的字拼接到值中
        //状态2  判断是字符串 进入到状态0   疑似key 变成确定的key 进入到栈中 疑似key清空  前面的值如果不未空也进入到栈中，清空值
        //       不是字符串   还是状态2   当前字拼接到疑似key中
        //       遇到识别的字  还是状态2  判断走上面两个
        //       遇到不识别的字  进入状态1  将当前的疑似key拼接到值中 疑似key清空

    }


/**
  输出的结果是 good

 [0]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    string(6) "身高"
  }
  [1]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    string(5) "170cm"
  }
  [2]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    string(6) "身体"
  }
  [3]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    string(12) "未见异常"
  }
  [4]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    string(6) "医生"
  }
  [5]=>
  array(2) {
    [0]=>
    int(1)
    [1]=>
    string(6) "皮肤"
  }
  [6]=>
  array(2) {
    [0]=>
    int(2)
    [1]=>
    string(6) "很好"
  }
}
**/


	//生成所需准备数据的方法
    public function generateMap(){
        $keywords = [
            "身高",
            "门齿",
            "皮肤",
            "医生",
            "身体",
            "身体改革委员会",
            "生命值",
            "生活"
        ];
        //身高1.8 身体改革委员会是你生命值100生活好啊
        $result = [];
        foreach($keywords as $val){
            $tmp = $this->getFirst(mb_str_split($val));
            $result = array_replace_recursive($result,$tmp);
        }
        return $result;
    }

    public function getFirst($strArr){
        $len = count($strArr);
        if($len == 1){
            return [$strArr[0]=>"是"];
        }else{
            $key = array_shift($strArr);
            return [$key=>$this->getFirst($strArr)];
        }
    }